/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista.rrhh;

import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.border.TitledBorder;
import modelo.Especialidad;
import modelo.OrdenDeCompra;
import modelo.RangoEspecialidad;
import modelo.TipoEspecialidad;
import org.hibernate.HibernateException;
import util.HibernateUtil;
import util.SwingPanel;
import util.Tupla;
import vista.compras.PantallaConsultarOrdenesDeCompra;
import vista.compras.RegistrarRecepcionDeRecursos;
import vista.interfaces.ICallBackGen;

/**
 * @author Iuga
 */
public class pantallaGestionarEspecialidades extends javax.swing.JInternalFrame implements ICallBackGen {

    private Especialidad especialidad;
    public static final String CALLBACK_SELECCION_ESPECIALIDAD = "SELECCION_ESPECIALIDAD";

    /**
     * Creates new form pantallaGestionarEspecialidades
     */
    public pantallaGestionarEspecialidades() {
        initComponents();
        initTipoEspecialidad();
        initRangoEspecialidad();
    }

    public pantallaGestionarEspecialidades(int idEspecialidad) {
        initComponents();
        cargarEspecialidad(idEspecialidad);
        initTipoEspecialidad();
        initRangoEspecialidad();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        txtEspecialidadSeleccionada = new javax.swing.JTextField();
        btnSeleccionarEspecialidad = new javax.swing.JButton();
        btnCerrar = new javax.swing.JButton();
        panelEditor = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        cmbTipoEspecialidad = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        cmbRangoEspecialidad = new javax.swing.JComboBox();
        jLabel3 = new javax.swing.JLabel();
        btnGuardar = new javax.swing.JButton();
        btnNuevoTipoEspecialidad = new javax.swing.JButton();
        btnModificarTipoEspecialidad = new javax.swing.JButton();
        jButton8 = new javax.swing.JButton();
        jButton9 = new javax.swing.JButton();
        txtPrecioPorHora = new javax.swing.JFormattedTextField();

        setClosable(true);
        setIconifiable(true);
        setResizable(true);
        setTitle("Gestionar Especialidades");

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Gestionar Especialidades"));

        txtEspecialidadSeleccionada.setFont(new java.awt.Font("Tahoma", 2, 11)); // NOI18N
        txtEspecialidadSeleccionada.setText("Seleccione una Especialidad para modificar ...");
        txtEspecialidadSeleccionada.setEnabled(false);

        btnSeleccionarEspecialidad.setText("...");
        btnSeleccionarEspecialidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSeleccionarEspecialidadActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(txtEspecialidadSeleccionada)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnSeleccionarEspecialidad))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(txtEspecialidadSeleccionada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(btnSeleccionarEspecialidad))
        );

        btnCerrar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/block.png"))); // NOI18N
        btnCerrar.setText("Cerrar");
        btnCerrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCerrarActionPerformed(evt);
            }
        });

        panelEditor.setBorder(javax.swing.BorderFactory.createTitledBorder("Nueva Especialidad"));

        jLabel1.setText("Tipo de Especialidad:");

        jLabel2.setText("Rango de la Especialidad:");

        cmbRangoEspecialidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbRangoEspecialidadActionPerformed(evt);
            }
        });

        jLabel3.setText("Precio por hora:");

        btnGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/add.png"))); // NOI18N
        btnGuardar.setText("Crear Nueva");
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });

        btnNuevoTipoEspecialidad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/add.png"))); // NOI18N
        btnNuevoTipoEspecialidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoTipoEspecialidadActionPerformed(evt);
            }
        });

        btnModificarTipoEspecialidad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/Modify.png"))); // NOI18N
        btnModificarTipoEspecialidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnModificarTipoEspecialidadActionPerformed(evt);
            }
        });

        jButton8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/add.png"))); // NOI18N
        jButton8.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton8ActionPerformed(evt);
            }
        });

        jButton9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/Modify.png"))); // NOI18N
        jButton9.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton9ActionPerformed(evt);
            }
        });

        txtPrecioPorHora.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(java.text.NumberFormat.getIntegerInstance())));

        javax.swing.GroupLayout panelEditorLayout = new javax.swing.GroupLayout(panelEditor);
        panelEditor.setLayout(panelEditorLayout);
        panelEditorLayout.setHorizontalGroup(
            panelEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 501, Short.MAX_VALUE)
            .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(panelEditorLayout.createSequentialGroup()
                .addGap(0, 0, Short.MAX_VALUE)
                .addComponent(btnGuardar))
            .addGroup(panelEditorLayout.createSequentialGroup()
                .addComponent(cmbRangoEspecialidad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton8, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton9, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGroup(panelEditorLayout.createSequentialGroup()
                .addComponent(cmbTipoEspecialidad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnNuevoTipoEspecialidad, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnModificarTipoEspecialidad, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addComponent(txtPrecioPorHora)
        );
        panelEditorLayout.setVerticalGroup(
            panelEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelEditorLayout.createSequentialGroup()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(panelEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(btnNuevoTipoEspecialidad, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cmbTipoEspecialidad))
                    .addComponent(btnModificarTipoEspecialidad))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelEditorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(cmbRangoEspecialidad)
                    .addGroup(panelEditorLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButton9)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel3)
                .addGap(1, 1, 1)
                .addComponent(txtPrecioPorHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btnGuardar))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(btnCerrar))
                    .addComponent(panelEditor, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelEditor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnCerrar)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnSeleccionarEspecialidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSeleccionarEspecialidadActionPerformed
        PantallaConsultarEspecialidades win = new PantallaConsultarEspecialidades();
        win.setSeleccionarEnabled(this, CALLBACK_SELECCION_ESPECIALIDAD);
        SwingPanel.getInstance().addWindow(win);
        win.setVisible(true);
    }//GEN-LAST:event_btnSeleccionarEspecialidadActionPerformed

    private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCerrarActionPerformed
        this.dispose();
    }//GEN-LAST:event_btnCerrarActionPerformed

    private void btnNuevoTipoEspecialidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoTipoEspecialidadActionPerformed
        nuevoTipoEspecialidad();
    }//GEN-LAST:event_btnNuevoTipoEspecialidadActionPerformed

    private void btnModificarTipoEspecialidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnModificarTipoEspecialidadActionPerformed
        if (cmbTipoEspecialidad.getSelectedIndex() >= 0) {
            Tupla tp = (Tupla) cmbTipoEspecialidad.getSelectedItem();
            if (tp != null) {
                modificarTipoEspecialidad(tp);
            }
        }
    }//GEN-LAST:event_btnModificarTipoEspecialidadActionPerformed

    private void cmbRangoEspecialidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbRangoEspecialidadActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_cmbRangoEspecialidadActionPerformed

    private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton8ActionPerformed
        nuevoRango();
    }//GEN-LAST:event_jButton8ActionPerformed

    private void jButton9ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton9ActionPerformed
        if (cmbRangoEspecialidad.getSelectedIndex() >= 0) {
            Tupla tp = (Tupla) cmbRangoEspecialidad.getSelectedItem();
            if (tp != null) {
                modificarRangoEspecialidad(tp);
            }
        }
    }//GEN-LAST:event_jButton9ActionPerformed

    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed
        
        String msg = "¿Está seguro que desea ";
        if(this.especialidad==null){
            msg += "crear ";
        }else{
            msg += "modificar ";
        }
        msg += "la Especialidad?";        
        
        if(this.especialidad==null){
            // CREO UNO NUEVO
            Especialidad esp = new Especialidad();
            
                Tupla tptipo = (Tupla)cmbTipoEspecialidad.getSelectedItem();
                TipoEspecialidad te = loadEspecialidad(tptipo);
                esp.setTipo(te);
                
                Tupla tprango = (Tupla) cmbRangoEspecialidad.getSelectedItem();
                RangoEspecialidad re = loadRangoEspecialidad(tprango);
                esp.setRango(re);
                
                if(txtPrecioPorHora.getText()!=null || !txtPrecioPorHora.getText().isEmpty()){
                    double precio = Double.parseDouble(txtPrecioPorHora.getText());
                    esp.setPrecioHoraNormal(precio);
                }else{
                    esp.setPrecioHoraNormal(0);
                }
                
                this.especialidad = esp;
            
        }else{
            // MODIFICO EL EXISTENTE
            Tupla tptipo = (Tupla)cmbTipoEspecialidad.getSelectedItem();
            TipoEspecialidad te = loadEspecialidad(tptipo);
            this.especialidad.setTipo(te);

            Tupla tprango = (Tupla) cmbRangoEspecialidad.getSelectedItem();
            RangoEspecialidad re = loadRangoEspecialidad(tprango);
            this.especialidad.setRango(re);

            if(txtPrecioPorHora.getText()!=null || !txtPrecioPorHora.getText().isEmpty()){
                double precio = Double.parseDouble(txtPrecioPorHora.getText());
                this.especialidad.setPrecioHoraNormal(precio);
            }else{
                this.especialidad.setPrecioHoraNormal(0);
            }
        }
        
        int seleccion = JOptionPane.showOptionDialog(
            this, // Componente padre
            msg, //Mensaje
            "Seleccione una opción", // Título
            JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.QUESTION_MESSAGE,
            null,    // null para icono por defecto.
            new Object[] { "Si", "No"},    // null para YES, NO y CANCEL
            "Si");

        if (seleccion != -1)
        {
           if((seleccion + 1)==1)
           {
              // PRESIONO SI
              guardarEspecialidad();
           }
        }        
        
    }//GEN-LAST:event_btnGuardarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCerrar;
    private javax.swing.JButton btnGuardar;
    private javax.swing.JButton btnModificarTipoEspecialidad;
    private javax.swing.JButton btnNuevoTipoEspecialidad;
    private javax.swing.JButton btnSeleccionarEspecialidad;
    private javax.swing.JComboBox cmbRangoEspecialidad;
    private javax.swing.JComboBox cmbTipoEspecialidad;
    private javax.swing.JButton jButton8;
    private javax.swing.JButton jButton9;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel panelEditor;
    private javax.swing.JTextField txtEspecialidadSeleccionada;
    private javax.swing.JFormattedTextField txtPrecioPorHora;
    // End of variables declaration//GEN-END:variables

    private void cargarEspecialidad(int idEspecialidad) {

        try {
            HibernateUtil.beginTransaction();
            this.especialidad = (Especialidad) HibernateUtil.getSession().load(Especialidad.class, idEspecialidad);
            HibernateUtil.commitTransaction();
        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            System.err.println("Error:" + e.getMessage());
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar la Especialidad a Modificar");
        }

        txtEspecialidadSeleccionada.setText(this.especialidad.mostrarTipoEspecialidad() + " | " + this.especialidad.mostrarRangoEspecialidad());
        btnGuardar.setText("Modificar Especialidad");
        btnGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/res/iconos/var/16x16/Modify.png")));
        TitledBorder border = (TitledBorder)panelEditor.getBorder();
        border.setTitle("Modificar Especialidad:");
        txtPrecioPorHora.setText(""+this.especialidad.getPrecioHoraNormal());
        
        initRangoEspecialidad();
        initTipoEspecialidad();
        
    }

    /**
     * Muestra un mensaje
     *
     * @param tipo
     * @param titulo
     * @param mensaje
     */
    public void mostrarMensaje(int tipo, String titulo, String mensaje) {
        JOptionPane.showMessageDialog(this.getParent(), mensaje, titulo, tipo);
    }

    @Override
    public void actualizar(int id, String flag, Class tipo) {
        if (CALLBACK_SELECCION_ESPECIALIDAD.equals(flag)) {
            if (tipo == Especialidad.class) {
                cargarEspecialidadParaModificacion(id);
            }
        }
    }

    private void cargarEspecialidadParaModificacion(int id) {
        cargarEspecialidad(id);
    }

    private void initTipoEspecialidad() {

        cmbTipoEspecialidad.removeAllItems();
        try {
            HibernateUtil.beginTransaction();
            List<TipoEspecialidad> tipos = HibernateUtil.getSession().createQuery("FROM TipoEspecialidad").list();
            HibernateUtil.commitTransaction();

            for (int i = 0; i < tipos.size(); i++) {
                TipoEspecialidad te = tipos.get(i);
                Tupla tp = new Tupla(te.getId(), te.getNombre());
                cmbTipoEspecialidad.addItem(tp);
                
                if(this.especialidad!=null){
                    if(tp.getId()==this.especialidad.getTipo().getId()){
                        cmbTipoEspecialidad.setSelectedItem(tp);
                    }
                }
                
            }

        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar la lista de Tipos de Especialidad");
        }
    }

    private void nuevoTipoEspecialidad() {
        String str = JOptionPane.showInputDialog(null, "Ingrese el nombre del Tipo de Especialidad : ", "", 1);
        if (str != null) {
            // Ingreso texto

            TipoEspecialidad te = new TipoEspecialidad();
            te.setNombre(str);
            te.setDescripcion(str);
            saveOrUpdateTipoEspecialidad(te);

        }
    }

    private void modificarTipoEspecialidad(Tupla tp) {
        String str = JOptionPane.showInputDialog(null, "Ingrese el nombre modificado del Tipo de Especialidad : ", tp.getNombre());
        if (str != null) {
            try {
                HibernateUtil.beginTransaction();
                TipoEspecialidad te = (TipoEspecialidad) HibernateUtil.getSession().load(TipoEspecialidad.class, tp.getId());
                HibernateUtil.commitTransaction();

                te.setNombre(str);
                te.setDescripcion(str);

                saveOrUpdateTipoEspecialidad(te);

            } catch (Exception e) {
                HibernateUtil.rollbackTransaction();
                System.err.println("Error:" + e.getMessage());
                mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar el tipo de Especialidad Seleccionada para Modificar");
            }
        }
    }

    private void saveOrUpdateTipoEspecialidad(TipoEspecialidad te) {
        try {
            HibernateUtil.beginTransaction();
            HibernateUtil.getSession().saveOrUpdate(te);
            HibernateUtil.commitTransaction();
        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "Se produjo un error al crear el nuevo Tipo de Especialidad");
            e.printStackTrace();
        }
        initTipoEspecialidad();
    }

    private void nuevoRango() {
        String str = JOptionPane.showInputDialog(null, "Ingrese el nombre del Rango : ", "", 1);
        if (str != null) {
            // Ingreso texto
            RangoEspecialidad re = new RangoEspecialidad();
            re.setNombre(str);
            saveOrUpdateRango(re);
        }
    }

    private void saveOrUpdateRango(RangoEspecialidad re) {
        try {
            HibernateUtil.beginTransaction();
            HibernateUtil.getSession().saveOrUpdate(re);
            HibernateUtil.commitTransaction();
        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "Se produjo un error al crear el nuevo Rango de Especialidad");
            e.printStackTrace();
        }
        initRangoEspecialidad();        
    }

    private void initRangoEspecialidad() {
        cmbRangoEspecialidad.removeAllItems();
        try {
            HibernateUtil.beginTransaction();
            List<RangoEspecialidad> tipos = HibernateUtil.getSession().createQuery("FROM RangoEspecialidad").list();
            HibernateUtil.commitTransaction();

            for (int i = 0; i < tipos.size(); i++) {
                RangoEspecialidad re = tipos.get(i);
                Tupla tp = new Tupla(re.getId(), re.getNombre());
                cmbRangoEspecialidad.addItem(tp);
                
                if(this.especialidad!=null){
                    if(tp.getId()==this.especialidad.getRango().getId()){
                        cmbRangoEspecialidad.setSelectedItem(tp);
                    }
                }
                
            }

        } catch (Exception e) {
            HibernateUtil.rollbackTransaction();
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar la lista de Rangos de Especialidad");
        }
    }

    private void modificarRangoEspecialidad(Tupla tp) {
        String str = JOptionPane.showInputDialog(null, "Ingrese el nombre modificado del Rango de Especialidad : ", tp.getNombre());
        if (str != null) {
            try {
                HibernateUtil.beginTransaction();
                RangoEspecialidad re = (RangoEspecialidad) HibernateUtil.getSession().load(RangoEspecialidad.class, tp.getId());
                HibernateUtil.commitTransaction();

                re.setNombre(str);

                saveOrUpdateRango(re);

            } catch (Exception e) {
                HibernateUtil.rollbackTransaction();
                System.err.println("Error:" + e.getMessage());
                mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar el Rango de Especialidad Seleccionada para Modificar");
            }
        }        
    }

    private TipoEspecialidad loadEspecialidad(Tupla tptipo) {
        TipoEspecialidad te = null;
        try
        {
            HibernateUtil.beginTransaction();
            te = (TipoEspecialidad)HibernateUtil.getSession().load(TipoEspecialidad.class,tptipo.getId());   
            HibernateUtil.commitTransaction();
        }
        catch(Exception e)
        {
            HibernateUtil.rollbackTransaction();
            System.err.println("Error:"+e.getMessage());
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar el Tipo de Especialidad");
        } 
        return te;
    }

    private RangoEspecialidad loadRangoEspecialidad(Tupla tprango) {
        RangoEspecialidad re = null;
        try
        {
            HibernateUtil.beginTransaction();
            re = (RangoEspecialidad)HibernateUtil.getSession().load(RangoEspecialidad.class,tprango.getId());   
            HibernateUtil.commitTransaction();
        }
        catch(Exception e)
        {
            HibernateUtil.rollbackTransaction();
            System.err.println("Error:"+e.getMessage());
            mostrarMensaje(JOptionPane.ERROR_MESSAGE, "Error!", "No se pudo cargar el Rango de Especialidad");
        } 
        return re;
    }

    private void guardarEspecialidad() {
        try
        {
            HibernateUtil.beginTransaction();
            HibernateUtil.getSession().saveOrUpdate(this.especialidad);
            HibernateUtil.commitTransaction();

        }catch(Exception e)
        {
            HibernateUtil.rollbackTransaction();
            mostrarMensaje(JOptionPane.ERROR_MESSAGE,"Error!","Se produjo un error al guardar la Especialidad");
            e.printStackTrace();
            return;
        } 
        
        mostrarMensaje(JOptionPane.INFORMATION_MESSAGE,"Exito!","Se guardo exitosamente la Especialidad");
        this.dispose();
    }
}
